package com.tbit.uqbike.service.rpcservice;

import com.alibaba.fastjson.JSONObject;
import com.tbit.uqbike.object.pojo.StatLineChartByPic;
import com.tbit.uqbike.object.pojo.statistics.GramData;
import com.tbit.uqbike.object.value.LoginInfo;
import com.tbit.uqbike.object.view.JsonResult;
import com.tbit.uqbike.object.view.NameObject;
import com.tbit.uqbike.object.view.OrderStatData;
import com.tbit.common.entity.view.Result;

import java.util.List;
import java.util.Map;

/**
 * @author MyWin E-mail:335918956@qq.com
 * @version 1.0
 * @createTime 2019-12-17 15:59
 */
public interface StatService {
    /**
     * 统计指定代理商的数据
     * 正常待租、骑行中、异常、故障
     *
     * @param li
     * @param accountIds
     * @return
     */
    List<NameObject> statCarStatus(LoginInfo li, List<Integer> accountIds);

    /**
     * 车辆电量分布统计
     * 0-20
     * 20-40
     * 40-60
     * >60
     *
     * @param li
     * @param accountIds
     * @return
     */
    List<NameObject> statCarBattery(LoginInfo li, List<Integer> accountIds);

    /**
     * 车辆空闲统计
     * 8 小时
     * 1 天
     * 2 天
     * 大于 2 天
     *
     * @param li
     * @param accountIds
     * @return
     */
    List<NameObject> statCarIdle(LoginInfo li, List<Integer> accountIds);

    /**
     * 用户类型统计
     * 免押会员数
     * 押金用户数
     * 实名认证
     * 信用认证数量
     * 黑名单用户
     *
     * @param li
     * @param accountIds
     * @return
     */
    List<NameObject> statNewUser(LoginInfo li, List<Integer> accountIds);

    /**
     * 统计总数，时间为空则为总数，不然按时间统计
     * 主要包含 总收入、骑行总收入、免押会员费用收入、罚款总收入、充值总收入、押金总数
     * 总订单数、总骑行订单数、总免押会员订单数、罚款订单数、充值订单数、押金订单数
     *
     * @param li
     * @param accountIds
     * @param startDt
     * @param endDt
     * @return
     */
    Map<String, Object> statTotalData(LoginInfo li, List<Integer> accountIds, Long startDt, Long endDt);


    /**
     * 统计总数，时间为空则为总数，不然按时间统计
     * 主要包含 总收入、骑行总收入、免押会员费用收入、罚款总收入、充值总收入、押金总数
     * 总订单数、总骑行订单数、总免押会员订单数、罚款订单数、充值订单数、押金订单数\
     * 3.0.0版本，为了不影响之前版本，新增了一个方法
     */
    Map<String, Object> statTotalDatas(LoginInfo li, List<Integer> accountIds, Integer machineType, Long startDt, Long endDt);


    /**
     * 统计所有的收入
     *
     * @param li
     * @param accountIds
     * @param startDt
     * @param endDt
     * @return
     */
    Double statTotalMoney(LoginInfo li, List<Integer> accountIds, Long startDt, Long endDt);

    /**
     * 统计当天
     * 主要包含 总收入、骑行总收入、免押会员费用收入、罚款总收入、充值总收入、押金总数
     * 总订单数、总骑行订单数、总免押会员订单数、罚款订单数、充值订单数、押金订单数
     *
     * @param li
     * @param accountIds
     * @return
     */
    Map<String, Object> statCurrentData(LoginInfo li, List<Integer> accountIds);

    /**
     * 按照区域统计各项数据
     * 押金和充值保存在第一个元素里面，只有品牌可以查看
     *
     * @param li
     * @param accountIds
     * @param startDt
     * @param endDt
     * @return
     */
    List<OrderStatData> statTotalByArea(LoginInfo li, List<Integer> accountIds, Long startDt, Long endDt);

    /**
     * 通过类型查询区域总收入和总订单量
     *
     * @param accountIds
     * @param startDt
     * @param endDt
     * @param type
     * @return
     */
    List<NameObject> statMoneyByType(List<Integer> accountIds, Long startDt, Long endDt, Integer type);

    /**
     * 订单按天统计或按月统计柱状图数据
     *
     * @param accountIds 区域id
     * @param startDt    开始时间
     * @param endDt      结束时间
     * @param type       查询类型 0按天分组 1 按月分组
     * @param selectType 统计类型 0 收入 1 订单量
     * @return
     */
    List<GramData> statMoByTime(List<Integer> accountIds, Long startDt, Long endDt, Integer type, Integer selectType);

    /**
     * 年龄分布
     *
     * @param accountIds
     * @return
     */
    List<NameObject> groupByBirth(List<Integer> accountIds);

    /**
     * 性别分布
     *
     * @param accountIds
     * @return
     */
    List<NameObject> groupBySex(List<Integer> accountIds);

    /**
     * 用户月、天增长统计
     *
     * @param accountIds
     * @param startDt
     * @param endDt
     * @param type
     * @return
     */
    List<NameObject> statUserByType(List<Integer> accountIds, Long startDt, Long endDt, Integer type);

    /**
     * 平台用户总余额统计、总欠款统计、总数统计、押金用户总数统计、押金用户总金额统计、车辆总数统计
     */
    JSONObject statByBid(Integer accountId);

    /**
     * 统计车辆信息
     * 每辆车只能统计一次，如果归属于多个分类，则按照最高优先级进行统计
     * 优先级：
     * 1、丢失车辆
     * 2、未投放车辆
     * 3、骑行中车辆
     * 4、故障车辆（如果用户上报故障不允许借车，需要额外统计用户上报故障）
     * 5、异常车辆（无信号/超区/电池异常）
     * 6、缺电车辆
     * 7、待租车辆
     *
     * @param li
     * @param idList
     * @return
     */
    List<NameObject> statCarStatusV2(LoginInfo li, List<Integer> idList);

    /**
     * 提供给运维端获取罚款费用
     * @param map accountIds 区域id集合 startDt 开始时间 endDt 结束时间
     * @return result
     */
    Result<Object> getFineMoney(Map<String, Object> map);

    /**
     * 产生订单折线图
     * @param statLineChartByPic statLineChartByPic
     * @return result
     */
    JsonResult hasOrder(StatLineChartByPic statLineChartByPic);


    /**
     * 统计车辆信息
     * 每辆车只能统计一次，如果归属于多个分类，则按照最高优先级进行统计
     * 优先级：
     * 1、丢失车辆
     * 2、未投放车辆
     * 3、骑行中车辆
     * 4、故障车辆（如果用户上报故障不允许借车，需要额外统计用户上报故障）
     * 5、异常车辆（无信号/超区/电池异常）
     * 6、缺电车辆
     * 7、待租车辆
     *
     * @param li
     * @param idList
     * @return
     */
    List<NameObject> statCarStatusV3(LoginInfo li, List<Integer> idList);

    /**
     * 根据区域id获取今日新增用户
     *
     * @param idList 区域id集合
     */
    Integer todayNewUser(List<Integer> idList);
}
